#ifndef FITKORDINARYMESHREADERFASTSIM_H
#define FITKORDINARYMESHREADERFASTSIM_H

#include "FITKOFMeshIOAPI.h"
#include "FITK_Interface/FITKInterfaceIO/FITKAbstractIO.h"

class QFile;

namespace Interface {
    class FITKUnstructuredMeshVTK;
    class FITKAbstractElement;
    class FITKMeshVTKManagerFASTSIM;
    class FITKElementHex8;
    class FITKElementPolygon;
}
namespace IO {
    /**
     * @brief  vtk,stl等网格文件头信息
     * @author yinyanjun
     * @date   2024-12-27
     */
    typedef struct {
        QString format{};
        QString clazz{};
        QString location{};
        QString object{};
    }FoamFileHeader;
    /**
     * @brief  边界
     * @author yinyanjun
     * @date   2024-07-22
     */
    typedef struct {
        QString name{};
        QString type{};
        QString group{};
        int nFaces{0};
        int startFace{0};

        bool isValid() {
            return !name.isEmpty() && !type.isEmpty() && nFaces != 0 && startFace != 0;
        }
    } Boundary;
    /**
     * @brief  vtk,stl等网格文件读取类
     * @author yinyanjun
     * @date   2024-12-27
     */
    class FITKOFMeshIOAPI FITKOrdinaryMeshReaderFASTSIM : public Interface::FITKAbstractIO
    {
    public:
        /**
         * @brief  构造函数
         * @author yinyanjun
         * @date   2024-12-27
         */
        FITKOrdinaryMeshReaderFASTSIM();
        /**
         * @brief  析构函数
         * @author yinyanjun
         * @date   2024-12-27
         */
        ~FITKOrdinaryMeshReaderFASTSIM() override;
        /**
         * @brief  重写线程启动函数
         * @author yinyanjun
         * @date   2024-12-27
         */
        void run() override;
        /**
         * @brief 打印控制台消息
         * @param[i] level 打印级别 1 normal 2 warning 3error
         * @param[i] str 消息
         * @author yinyanjun
         * @date   2024-12-27
         */
        void consoleMessage(int level, const QString &str) override;
        /**
         * @brief  设置数据
         * @param  data Interface::FITKUnstructureFluidMeshVTK类型对象
         * @author yinyanjun
         * @date   2024-07-25
         */
        void setDataObject(Core::FITKAbstractDataObject* data) override;
        /**
         * @brief  读取网格文件
         * @author yinyanjun
         * @date   2024-12-27
         */
        bool read();

    protected:

        /**
         * @brief  计算hex8单元的节点信息
         * @param  face 面（节点列表）
         * @param  inIdPrev 已知节点1（按OpenFOAM右手法则排序在前）
         * @param  inIdNext 已知节点2（按OpenFOAM右手法则排序在后）
         * @param[out]  outIdPrev 未知节点1（按OpenFOAM右手法则排序在前）
         * @param[out]  outIdNext 未知节点2（按OpenFOAM右手法则排序在后）
         * @author yinyanjun
         * @date   2024-12-27
         */
//        bool getHex8IdsByFace(QList<int> face, int inIdPrev, int inIdNext, int& outIdPrev, int& outIdNext);
        /**
         * @brief  装配hex8单元
         * @param  eleIndex 单元索引
         * @param  points 每个面上点的列表
         * @return 装配完的hex8单元或者空指针
         * @author yinyanjun
         * @date   2024-12-27
         */
//        Interface::FITKElementHex8* setupHex8Cell(int eleIndex, QVector<QList<int>> points);
        /**
         * @brief  装配多边形单元
         * @param  eleIndex 单元索引
         * @param  points 每个面上点的列表
         * @return 装配完的单元或者空指针
         * @author yinyanjun
         * @date   2024-12-27
         */
//        Interface::FITKElementPolygon* setupPolygonCell(QList<int> face);
        /**
         * @brief  装配单元
         * @param  eleIndex 单元索引
         * @param  faces 面索引列表
         * @return 装配完的单元或空指针
         * @author yinyanjun
         * @date   2024-12-27
         */
//        Interface::FITKAbstractElement* setupCell(int eleIndex, QList<int> faces);
        /**
         * @brief  装配3D单元
         * @author yinyanjun
         * @date   2024-12-27
         */
//        bool setup3DCells();
        /**
         * @brief  装配2D单元
         * @author yinyanjun
         * @date   2024-12-27
         */
//        bool setup2DCells();
        /**
         * @brief  装配边界
         * @author yinyanjun
         * @date   2024-07-25
         */
        bool setupBoundarys();

    private:
        /**
         * @brief  内部网格数据
         * @author yinyanjun
         * @date   2024-07-16
         */
        Interface::FITKUnstructuredMeshVTK* _fluidMesh{};
        /**
         * @brief  边界管理器
         * @author yinyanjun
         * @date   2024-07-25
         */
        Interface::FITKMeshVTKManagerFASTSIM* _boundaryManager{};
        /**
         * @brief  节点总数
         * @author yinyanjun
         * @date   2024-07-16
         */
        int _pointsNum{};
        /**
         * @brief  face总数
         * @author yinyanjun
         * @date   2024-07-16
         */
        int _facesNum{};
        /**
         * @brief  face列表<节点索引列表>
         * @author yinyanjun
         * @date   2024-07-16
         */
        QVector<QList<int>> _faces{};
        /**
         * @brief  边界
         * @author yinyanjun
         * @date   2024-07-22
         */
        QList<Boundary*> _Boundarys{};
    };
}

#endif // FITKORDINARYMESHREADERFASTSIM_H
